home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Pascal Super Library
/
Pascal Super Library (CW International)(1997).bin
/
DBASE_UT
/
TPDB335
/
TPDBSORT.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-11-26
|
4KB
|
158 lines
unit TPDBSORT;
(***********************************)
(* TPDB *)
(***********************************)
(* Object -Oriented *)
(* Borland/Turbo Pascal Units *)
(* for Accessing dBASE III *)
(* files. *)
(* Copyright 1988 - 1993 *)
(* Brian Corll *)
(* All Rights Reserved *)
(***********************************)
(* FREEWARE *)
(***********************************)
(* dBASE is a registered *)
(* trademark of Borland Int. Inc. *)
(* Version 3.35 November, 1993 *)
(***********************************)
(* Portions Copyright 1984,1991 *)
(* Borland International Corp. *)
(***********************************)
interface
uses
Crt, TPDB, TPDBSrtS, TPDBSrtL, TPDBStr;
const
OneA : Byte = $1A;
type
SortingFunction = function: DBKey;
ProcPtr = ^byte;
var
SortFile : DataObject;
SortFunc : SortingFunction;
PROCEDURE SortOn(Operation : SortingFunction;Source,Dest : FileName);
IMPLEMENTATION
CONST
EOFMarker : Char = #26;
TYPE
SortRecord = RECORD
KeyStr : DBKey;
RecNum : LONGINT;
END;
VAR
SortRec : SortRecord;
OutFile : File;
SortResult,LSortResult : Integer;
SortFileName : FileName;
{$F+}
PROCEDURE ReadRecs;
VAR
RecNum : LONGINT;
BEGIN
RecNum := 1;
FOR RecNum := 1 TO SortFile^.TotalRecs do
BEGIN
SortFile^.GetDBRec(RecNum);
SortRec.KeyStr := SortFunc;
SortRec.RecNum := RecNum;
SortRelease(SortRec);
END;
END;
FUNCTION LessRecs(VAR x,y : SortRecord) : BOOLEAN;
BEGIN
LessRecs := x.KeyStr < y.KeyStr;
END;
PROCEDURE WriteRecs;
VAR
X : LONGINT;
FNo : BYTE;
BEGIN
Assign(OutFile,SortFileName);
ReWrite(OutFile,1);
BlockWrite(OutFile,SortFile^.Header^,32,ErrCode);
For FNo := 1 to SortFile^.NumFields do
BlockWrite(OutFile,SortFile^.Fields^[FNo],32,ErrCode);
SortFile^.Header^.Terminator := Chr(Ord($0D));
BlockWrite(OutFile,SortFile^.Header^.Terminator,1,ErrCode);
X := 1;
REPEAT
SortReturn(SortRec);
SortFile^.GetDBRec(SortRec.RecNum);
BlockWrite(OutFile,Mem[Seg(SortFile^.DBRecord^):Ofs(SortFile^.DBRecord^)],SortFile^.Header^.RecordLen);
UNTIL SortEOS;
Close(OutFile);
END;
PROCEDURE LReadRecs;
VAR
RecNum : LONGINT;
BEGIN
RecNum := 1;
REPEAT
SortFile^.GetDBRec(RecNum);
SortRec.KeyStr := SortFunc;
SortRec.RecNum := RecNum;
SortRelease(SortRec);
INC(RecNum);
UNTIL SortFile^.DBEOF;
END;
FUNCTION LLessRecs(VAR x,y : SortRecord) : BOOLEAN;
BEGIN
LLessRecs := x.KeyStr < y.KeyStr;
END;
PROCEDURE LWriteRecs;
VAR
X : LONGINT;
FNo : BYTE;
BEGIN
Assign(OutFile,SortFileName);
ReWrite(OutFile,1);
BlockWrite(OutFile,SortFile^.Header^,32,ErrCode);
For FNo := 1 to SortFile^.NumFields do
BlockWrite(OutFile,SortFile^.Fields^[FNo],32,ErrCode);
SortFile^.Header^.Terminator := Chr(Ord($0D));
BlockWrite(OutFile,SortFile^.Header^.Terminator,1,ErrCode);
BlockWrite(OutFile,OneA,1,ErrCode);
X := 1;
REPEAT
SortReturn(SortRec);
SortFile^.GetDBRec(SortRec.RecNum);
BlockWrite(OutFile,Mem[Seg(SortFile^.DBRecord^):Ofs(SortFile^.DBRecord^)],SortFile^.Header^.RecordLen);
UNTIL SortEOS;
BlockWrite(OutFile,EOFMarker,1);
Close(OutFile);
END;
{$F-}
PROCEDURE SortOn(Operation : SortingFunction;Source,Dest : FileName);
BEGIN
NEW(SortFile,Init(Source));
SortFileName := Dest;
IF SortFile^.TotalRecs <= 32767 THEN
SortResult := SmallTPDBSort(SizeOf(SortRec),@ReadRecs,@LessRecs,@WriteRecs)
ELSE
LSortResult := LargeTPDBSort(SizeOf(SortRec),@LReadRecs,@LLessRecs,@LWriteRecs);
DISPOSE(SortFile,Done);
END;
BEGIN
END.